package cn.itcast.scala.course07

/**
  * 高阶函数
  * create by zhangtian on 2019/1/8
  */
object HighFunctionApp extends App {
  val l = List(1, 2, 3, 4, 5, 6, 7, 8)

  // map: 逐个去操作集合中的每个元素
  println("***************** map逐个去操作集合中的每个元素 *****************")
  l.map((x: Int)=>x + 1).foreach(x=>print(x + " "))
  println()
  l.map(x=>x + 1).foreach(x=>print(x + " ")) // 当只有一个参数时可以省略（）
  println()
  l.map(_ + 1).foreach(x=>print(x + " ")) // 当只有一个参数时可以省略（）并使用占位符_表示l中每个元素
  println()
  l.map(_ * 2).foreach(x=>print(x + " "))

  println("***************** filter过滤集合中的元素 *****************")
  l.map(_ * 2).filter(_ > 8).foreach(x => print(x + " "))
  println()

  println("***************** take获取集合中的前几个元素 *****************")
  l.take(2).foreach(x => print(x + " ")) // 获取2个元素
  println()
  l.take(4).foreach(x => print(x + " ")) // 获取4个元素

  println("***************** reduce集合中的元素运算 *****************")
  println("两两求和:"+l.reduce(_ + _))
  println("两两**:"+l.reduceLeft(_ - _))
  println("两两**:"+l.reduceRight(_ - _))
  l.max
  l.min
  l.sum

  println("***************** flat集合压扁 *****************")
  val ll = List(List(1, 2),List(3, 4),List(5, 6), List(7, 8))
  ll.flatten.foreach(x => print(x + " "))

  println()
  // flatMap压扁集合并进行map运算
  ll.flatMap(_.map(_ * 2)).foreach(x => print(x + " "))

  println()
  val txt = scala.io.Source.fromFile("D:\\Developer\\IDEAWorkspace\\LearningScala2.11.12\\scala-train\\src\\main\\scala\\cn\\itcast\\scala\\course07\\flatMap").mkString
  val txts = List(txt)
  // 如何利用scala来完成wordcount统计
  txts.flatMap(_.split(",")).map(x=>(x, 1)).foreach(x => print(x + " "))
  println()
}
